package com.zxy.util;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

/**
 * MyBatis-Plus 字段自动填充处理器
 */
@Component // 必须交给Spring管理
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 插入操作时的填充逻辑
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        // 1. 填充createTime（替代之前的切面，可选）
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        // 2. 填充updateTime（插入时也需要初始化updateTime）
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());

        // 3. 填充createBy：获取当前登录用户的ID/用户名
        String currentUserId = getCurrentLoginUserId(); // 关键：获取当前登录用户
        this.strictInsertFill(metaObject, "createBy", String.class, currentUserId);
        // 4. 填充updateBy（插入时和createBy一致）
        this.strictInsertFill(metaObject, "updateBy", String.class, currentUserId);
    }

    /**
     * 更新操作时的填充逻辑
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 1. 填充updateTime
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
        // 2. 填充updateBy：获取当前登录用户
        String currentUserId = getCurrentLoginUserId();
        this.strictUpdateFill(metaObject, "updateBy", String.class, currentUserId);
    }

    /**
     * 获取当前登录用户的ID/用户名（根据你的权限框架调整）
     * 如果用Spring Security，可通过SecurityContext获取；如果是自定义登录，从ThreadLocal获取
     */
    private String getCurrentLoginUserId() {
        // Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // if (authentication != null && authentication.isAuthenticated()) {
        //     return authentication.getName(); // 或获取用户ID：((UserDetails)authentication.getPrincipal()).getId()
        // }

        // 示例2：自定义ThreadLocal存储登录信息（假设你有一个UserContext工具类）
        // UserLoginDTO loginUser = UserContext.getCurrentUser();
        // return loginUser != null ? loginUser.getId().toString() : "system"; // 兜底：如"system"

        // 临时测试：如果还没做登录功能，可先返回固定值（正式环境必须替换！）
        return "admin";
    }
}